#include "Date.h"

//class A
//{
//public:
//	A(int a = 0)
//	{
//      _a = a;
//		cout << "A(int a = 0)->" <<_a<< endl;
//	}
//
//	~A()
//	{
//		cout << "~A()->" <<_a<<endl;
//	}
//private:
//	int _a;
//};
//
//A aa3(3);
//
//void f()
//{
//	static int i = 0;
//	static A aa0(0);
//	A aa1(1);
//	A aa2(2);
//	static A aa4(4);
//}
//
//// 构造顺序：3 0 1 2 4 1 2
//// 析构顺序：~2 ~1 ~2 ~1 ~4 ~0 ~3
//int main()
//{
//	f();
//	f();
//
//	return 0;
//}


//class A
//{
//public:
//	A(int a = 0)
//	{
//		_a = a;
//		cout << "A(int a = 0)->" << _a << endl;
//	}
//
//	// A aa2(aa1);
//	A(const A& aa)
//	{
//		_a = aa._a;
//		cout << "A(const A& aa)->" << _a << endl;
//	}
//
//	~A()
//	{
//		cout << "~A()->" << _a << endl;
//	}
//private:
//	int _a;
//};
//
//void func1(A aa)
//{
//
//}
//
//void func2(A& aa)
//{
//
//}
//
//A func3()
//{
//	static A aa(3);
//	return aa;
//}
//
//A& func4()
//{
//	static A aa(4);
//	return aa;
//}
//
//int main()
//{
//	//A aa1(1);
//	//A aa2(aa1);
//
//	//func1(aa1);
//	//func2(aa1);
//	func3();
//	cout << endl << endl;
//	func4();
//
//	//int i = 0;
//	//int& j = i;
//	//cout << typeid(j).name() << endl;
//
//	return 0;
//}

//#pragma once
//
//class Time
//{
//public:
//	Time()
//	{
//		_hour = 1;
//		_minute = 1;
//		_second = 1;
//	}
//
//	Time& operator=(const Time& t)
//	{
//		cout << "Time& operator=(const Time& t)" << endl;
//		if (this != &t)
//		{
//			_hour = t._hour;
//			_minute = t._minute;
//			_second = t._second;
//		}
//
//		return *this;
//	}
//private:
//	int _hour;
//	int _minute;
//	int _second;
//};
//
//class Date
//{
//public:
//	// 构造会频繁调用，所以直接放在类里面定义作为inline
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	Date(const Date& d)
//	{
//		cout << "Date(const Date& d)" << endl;
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//
//	// d1 = d3;
//	// d2 = d2;
//	//Date& operator=(const Date& d)
//	////Date operator=(const Date d)
//	//{
//	//	if (this != &d)
//	//	{
//	//		_year = d._year;
//	//		_month = d._month;
//	//		_day = d._day;
//	//	}
//
//	//	return *this;
//	//}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//
//	// 自定义类型
//	Time _t;
//};
//
//
//// 这里会发现下面的程序会崩溃掉？这里就需要深拷贝去解决。
//typedef int DataType;
//class Stack
//{
//public:
//	Stack(size_t capacity = 10)
//	{
//		_array = (DataType*)malloc(capacity * sizeof(DataType));
//		if (nullptr == _array)
//		{
//			perror("malloc申请空间失败");
//			return;
//		}
//
//		_size = 0;
//		_capacity = capacity;
//	}
//
//	void Push(const DataType& data)
//	{
//		// CheckCapacity();
//		_array[_size] = data;
//		_size++;
//	}
//
//	~Stack()
//	{
//		if (_array)
//		{
//			free(_array);
//			_array = nullptr;
//			_capacity = 0;
//			_size = 0;
//		}
//	}
//
//private:
//	DataType *_array;
//	size_t _size;
//	size_t _capacity;
//};
//
//// 构造、拷贝构造、赋值重载、析构默认生成都可以用
//class MyQueue
//{
//private:
//	Stack _st1;
//	Stack _st2;
//};
//


void TestDate1()
{
	Date d1(2023, 7, 24);
	Date d2(2023, 7, 25);
	Date d3(2022, 7, 25);

	cout << (d1 < d2) << endl;
	cout << (d1 < d3) << endl;
	cout << (d1 == d3) << endl;
	cout << (d1 > d3) << endl;
}

void TestDate2()
{
	//Date d1(2022, 7, 24);
	//d1 += 4;
	//d1.Print();

	//d1 += 40; // 跨月
	//d1.Print();

	//d1 += 400;// 跨年
	//d1.Print();

	//d1 += 4000; // 跨闰年
	//d1.Print();

	Date d1(2022, 7, 24);
	/*Date d2 = d1 + 4;
	d2.Print();*/
	(d1 + 4).Print();
	(d1 + 40).Print();// 跨月
	(d1 + 400).Print();// 跨年
	(d1 + 4000).Print(); // 跨闰年
	(d1 + 40000).Print();

	Date ret1 = ++d1; // d1.operator++(&d1)
	Date ret2 = d1++; // d1.operator++(&d2, 0)
}

void TestDate3()
{
	Date d1(2022, 7, 25);
	(d1 - 4).Print();
	(d1 - 40).Print();// 跨月
	(d1 - 400).Print();// 跨年
	(d1 - 4000).Print(); // 跨闰年
	(d1 - 40000).Print();

	Date d2(2022, 7, 25);
	Date d3(2023, 2, 15);
	cout << d2 - d3 << endl;
	cout << d3 - d2 << endl;

	Date d4(2000, 2, 15);
	cout << d2 - d4 << endl;
	cout << d4 - d2 << endl;
}

void TestDate4()
{
	/*Date d1(2022, 7, 32);
	d1.Print();

	Date d2(2022, 2, 29);
	d2.Print();

	d2++;
	d2.Print();*/

	Date d1(2022, 7, 25);
	Date d2(2022, 7, 26);
	cout << d1 << d2;

	cin >> d1 >> d2;
	cout << d1 << d2;



	//d1.operator<<(cout);
	//d1 << cout;

	//cout << (d1 + 100);
	//(d1 + 100).Print();
	//(d1 + -100).Print();
}

void TestDate5()
{
	const char* WeeDayToStr[] = { "周一", "周二", "周三", "周四", "周五", "周六", "周天" };
	Date d1, d2;
	int day = 0;
	int option = 0;
	do {
		cout << "*******************************" << endl;
		cout << " 1、日期加/减天数 2、日期减日期" << endl;
		cout << " 3、日期->周几   -1、退出" << endl;
		cout << "*******************************" << endl;

		cout << "请选择:>";
		cin >> option;
		if (option == 1)
		{
			cout << "请依次输入日期及天数(减天数就输入负数)：";
			cin >> d1 >> day;
			cout << "日期加减天数后的日期：" << d1 + day << endl;
		}
		else if (option == 2)
		{
			cout << "请依次输入两个日期：";
			cin >> d1 >> d2;
			cout << "相差的天数：" << d1 - d2 << endl;
		}
		else if (option == 3)
		{
			cout << "请输入日期：";
			cin >> d1;
			Date start(1, 1, 1);
			int n = d1 - start;
			int weekDay = 0; // 周一
			weekDay += n;
			//weekDay += 9;
			//cout << "周" << weekDay % 7 + 1 << endl;
			cout << WeeDayToStr[weekDay % 7] << endl;
		}
		else
		{
			cout << "无此选项，请重新选择" << endl;
		}
	} while (option != -1);
}

void TestDate6()
{
	Date d1(2022, 7, 25);
	const Date d2(2022, 7, 25);
	d1.Print();
	d2.Print();

	d1 < d2;
	d2 < d1;
}

//int main()
//{
//	//TestDate6();
//
//	//int i = 0;
//	//double d = 1.1;
//	//cout << i; // cout.operator<<(i);
//	//cout << d; // cout.operator<<(d);
//
//	return 0;
//}

class A
{
public:
	// 默认成员函数，不写编译器会自动生成，自动生成就够用了，所以一般是不需要自己写的
	// 特殊场景：不想让别人取到这个类型对象的地址
	A* operator&()
	{
		return nullptr;
	}

	const A* operator&()const
	{
		return nullptr;
	}

	void Print() const
	{
		//_year = 1;
		cout << _year << "/" << _month << "/" << _day << endl;
	}

	/*void Print()
	{
	_year = 1;
	cout << _year << "/" << _month << "/" << _day << endl;
	}*/
private:
	int _year;   // 年
	int _month; // 月
	int _day;   // 日
};

int main()
{
	A d1;
	const A d2;
	d1.Print();
	d2.Print();

	cout << &d1 << endl;
	cout << &d2 << endl;

	return 0;
}